package modelo;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

public class AdmSemaforos {
	
	private Integer cantidad;
	private List<Semaforo> semaforos;
	private Queue<Semaforo> cola;
	
	public AdmSemaforos(Integer cantidad) {
		super();
		this.cantidad = cantidad;
		this.cola = new ArrayDeque<Semaforo>();
		this.createSemaforos();
	}
	
	protected void createSemaforos() {
		this.semaforos = new ArrayList<Semaforo>();
		for (int i = 0; i < this.cantidad; i++) {
			Semaforo sem = new Semaforo(i, this);
			this.semaforos.add(i, sem);
		}
	}
	
	public void initSemaforos() {
		for (Semaforo semaforo : this.getSemaforos()) {
			semaforo.start();
		}
	}
	
	public synchronized void getVerde(Semaforo semaforo) {
		try {
			this.cola.add(semaforo);
			while (this.cola.peek() != semaforo) {
				wait();
			}
			System.out.println("SEMAFORO " + semaforo.getIdSemaforo() + " OBTIENE EL VERDE");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void liberarVerde(Semaforo semaforo) {
		System.out.println("SEMAFORO " + semaforo.getIdSemaforo() + " LIBERA EL VERDE");
		this.cola.remove(semaforo);
		notifyAll();
	}
	
	public Semaforo getSemaforo(Integer id) {
		return this.semaforos.get(id);
	}

	//==== GETTERS Y SETTERS ====
	
	public Integer getCantidad() {
		return cantidad;
	}

	public void setCantidad(Integer cantidad) {
		this.cantidad = cantidad;
	}

	public List<Semaforo> getSemaforos() {
		return semaforos;
	}

	public void setSemaforos(List<Semaforo> semaforos) {
		this.semaforos = semaforos;
	}

}
